#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;//重命名int
typedef struct node{
    elemtype data;
    struct node*next;
}node;//定义新结构体node

node* initList()
{
    node*head = (node*)malloc(sizeof(node));//
    head->data = 0;
    head->next = NULL;//初始化链表
    return head;
}

int insertHead(node*L,elemtype e)
{
    node*p = (node*)malloc(sizeof(node));
    p->data = e;
    p->next = L->next;
    L->next = p;
    return 1; 
}//头插法

node* get_tail(node*L)
{
    node*P=L;
    while(P->next!=NULL)
    {
        P=P->next;
    }
    return P;
}//获取尾节点

node*insertTail(node*tail,elemtype e)
{
    node*P=(node*)malloc(sizeof(node));
    P->data=e;
    tail->next=P;
    P->next=NULL;
    return P;
}//尾插

int insertnode(node*L,int post,elemtype e)
{//用来保存插入位置的前驱结点
    node*p=L;
    int i=0;
    //遍历链表找到插入位置的前驱结点
    while(i<post-1)
    {
        p=p->next;
        i++;
        if(p==NULL)
        {
            return 0;
        }
    }
    node*q=(node*)malloc(sizeof(node));
    q->data=e;
    q->next=p->next;
    p->next=q;
    return 1;//要插入的新节点
}

int deletenode(node*L,int post)
{//要删除节点的前驱
    node*p=L;
    int i=0;
    while(i<post-1)
    {//遍历链表，找到要删除节点的前驱
        p=p->next;
        i++;
        if(p==NULL)
        {
            return 0;
        }
    }
    if(p->next==NULL)
    {
        printf("要删除的位置错误\n");
        return 0;
    }
    node*q=p->next;//q指向要删除的节点
    p->next=q->next;//让要删除节点的前驱指向要删除节点的后继
    free(q);//释放要删除节点的空间
    return 1;
}

void freeList(node*L)
{
    node*p=L->next;
    node*q;
    while(p!=NULL)
    {
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;
}

void listnode(node*L)
{
    node*p = L->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}//遍历

int main()
{
    node*list=initList();
    node*tail=get_tail(list);
    tail=insertTail(tail,10);
    tail=insertTail(tail,20);
    tail=insertTail(tail,30);
    listnode(list);
    insertnode(list,2,15);
    listnode(list);
    deletenode(list,2);
    listnode(list);
    return 0;
}




